﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область СлужебныйПрограммныйИнтерфейс

Функция ДоступенМодульЛокализации() Экспорт
	Возврат Метаданные.ОбщиеМодули.Найти("УправлениеКонтактнойИнформациейЛокализация") <> Неопределено;
КонецФункции

Функция ДоступныМодулиРаботаСАдресами() Экспорт
	Возврат Метаданные.ОбщиеМодули.Найти("РаботаСАдресами") <> Неопределено;
КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

// Определяет наличие подсистемы АдресныйКлассификатор и наличие записей о регионах в регистре сведений
// АдресныеОбъекты.
//
// Возвращаемое значение:
//  ФиксированноеСоответствие из КлючИЗначение:
//    * Ключ - Строка - "КлассификаторДоступен", "ИспользоватьЗагруженные", "ИспользуетсяАдресныйКлассификатор"
//    * Значение - Булево
//
Функция СведенияОДоступностиАдресногоКлассификатора() Экспорт
	
	Результат = Новый Соответствие;
	Результат.Вставить("КлассификаторДоступен",             Ложь);
	Результат.Вставить("ИспользоватьЗагруженные",           Ложь);
	Результат.Вставить("ИспользуетсяАдресныйКлассификатор", Ложь);
	
	Результат["ИспользуетсяАдресныйКлассификатор"] = ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.АдресныйКлассификатор");
	Если Не Результат["ИспользуетсяАдресныйКлассификатор"] Тогда
		Возврат Новый ФиксированноеСоответствие(Результат);
	КонецЕсли;
	
	МодульАдресныйКлассификаторСлужебный = ОбщегоНазначения.ОбщийМодуль("АдресныйКлассификаторСлужебный");
	СведенияОДоступностиАдресныхСведений = МодульАдресныйКлассификаторСлужебный.СведенияОДоступностиАдресныхСведений();
	
	Результат["КлассификаторДоступен"]   = СведенияОДоступностиАдресныхСведений.Получить("КлассификаторДоступен");
	Результат["ИспользоватьЗагруженные"] = СведенияОДоступностиАдресныхСведений.Получить("ИспользоватьЗагруженные");
	
	Возврат Новый ФиксированноеСоответствие(Результат);
	
КонецФункции

// Возвращает значение перечисления тип вида контактной информации.
//
//  Параметры:
//    ВидИнформации - СправочникСсылка.ВидыКонтактнойИнформации
//                  - Структура - источник данных.
//
Функция ТипВидаКонтактнойИнформации(Знач ВидИнформации) Экспорт
	Результат = Неопределено;
	
	Тип = ТипЗнч(ВидИнформации);
	Если Тип = Тип("ПеречислениеСсылка.ТипыКонтактнойИнформации") Тогда
		Результат = ВидИнформации;
	ИначеЕсли Тип = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
		Результат = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ВидИнформации, "Тип");
	ИначеЕсли ВидИнформации <> Неопределено Тогда
		Данные = Новый Структура("Тип");
		ЗаполнитьЗначенияСвойств(Данные, ВидИнформации);
		Результат = Данные.Тип;
	КонецЕсли;
	
	Возврат Результат;
КонецФункции

Функция НаименованияВидовКонтактнойИнформации() Экспорт
	
	Результат = Новый Соответствие;
	Для каждого Язык Из Метаданные.Языки Цикл
		Наименования = Новый Соответствие;
		УправлениеКонтактнойИнформациейПереопределяемый.ПриПолученииНаименованийВидовКонтактнойИнформации(Наименования, Язык.КодЯзыка);
		Результат[Язык.КодЯзыка] = Наименования;
	КонецЦикла;
	
	Возврат Новый ФиксированноеСоответствие(Результат);
	
КонецФункции

// Возвращает список предопределенных видов контактной информации.
//
// Возвращаемое значение:
//  ФиксированноеСоответствие из КлючИЗначение:
//   * Ключ - Строка - имя предопределенного вида.
//   * Значение - СправочникСсылка.ВидыКонтактнойИнформации - ссылка на элемент справочника ВидыКонтактнойИнформации.
//
Функция ВидыКонтактнойИнформацииПоИмени() Экспорт
	
	Виды = Новый Соответствие;
	ПредопределенныеВиды = УправлениеКонтактнойИнформацией.ПредопределенныеВидыКонтактнойИнформации();
	
	Для каждого ПредопределенныеВид Из ПредопределенныеВиды Цикл
		Виды.Вставить(ПредопределенныеВид.Имя, ПредопределенныеВид.Ссылка);
	КонецЦикла;
	
	Возврат Новый ФиксированноеСоответствие(Виды);
	
КонецФункции

Функция КонтактнаяИнформацияОбъектаСодержитКолонкуДействуетС(ОбъектСсылка) Экспорт
	Возврат ОбъектСсылка.Метаданные().ТабличныеЧасти.КонтактнаяИнформация.Реквизиты.Найти("ДействуетС") <> Неопределено;
КонецФункции

Функция ГруппаВидаКонтактнойИнформацииПоИмениОбъекта(ПолноеИмяОбъектаМетаданных) Экспорт
	ИмяГруппыВидовКИ = СтрЗаменить(ПолноеИмяОбъектаМетаданных, ".", "");
	
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	|	ВидыКонтактнойИнформации.Ссылка КАК Ссылка,
	|ВЫБОР
	|	КОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида <> """"
	|	ТОГДА ВидыКонтактнойИнформации.ИмяПредопределенногоВида
	|	ИНАЧЕ ВидыКонтактнойИнформации.ИмяПредопределенныхДанных
	|КОНЕЦ КАК ИмяПредопределенногоВида
	|ИЗ
	|	Справочник.ВидыКонтактнойИнформации КАК ВидыКонтактнойИнформации
	|ГДЕ
	|	ВидыКонтактнойИнформации.ЭтоГруппа = ИСТИНА
	|	И ВидыКонтактнойИнформации.ПометкаУдаления = ЛОЖЬ
	|	И ВидыКонтактнойИнформации.Используется = ИСТИНА";
	
	РезультатЗапроса = Запрос.Выполнить().Выбрать();
	Пока РезультатЗапроса.Следующий() Цикл
		Если СтрСравнить(РезультатЗапроса.ИмяПредопределенногоВида, ИмяГруппыВидовКИ) = 0 Тогда
			Возврат РезультатЗапроса.Ссылка;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

Функция КартинкиТиповКонтактнойИнформации() Экспорт
	
	КартинкиТиповКонтактнойИнформации = Новый Соответствие;
	
	КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Skype, БиблиотекаКартинок.Skype);	
	КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Адрес, БиблиотекаКартинок.Адрес);	
	КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты, БиблиотекаКартинок.ЭлектроннаяПочта);	
	КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.ВебСтраница, БиблиотекаКартинок.ВебСтраница);	
	КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Другое, БиблиотекаКартинок.Другое);	
	КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Телефон, БиблиотекаКартинок.ТелефонныйЗвонок);
	КартинкиТиповКонтактнойИнформации.Вставить(Перечисления.ТипыКонтактнойИнформации.Факс, БиблиотекаКартинок.Факс);	
	
	Возврат Новый ФиксированноеСоответствие(КартинкиТиповКонтактнойИнформации);
	
КонецФункции

// См. УправлениеКонтактнойИнформацией.КомандыТипаКонтактнойИнформации
Функция КомандыТипаКонтактнойИнформации(Тип) Экспорт

	КомандыТипа = Новый Структура;

	Если Тип = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда

		КомандыТипа.Вставить("ВвестиКомментарийКАдресу", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ВвестиКомментарийКАдресу"));
		КомандыТипа.Вставить("ПоказатьНаКартеЯндекс",    УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьНаКартеЯндекс"));
		КомандыТипа.Вставить("ПоказатьНаКартеGoogle",    УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьНаКартеGoogle"));
		КомандыТипа.Вставить("ЗапланироватьВстречу",     УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ЗапланироватьВстречу"));
		КомандыТипа.Вставить("ПоказатьИсториюИзменений", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьИсториюИзменений"));

	ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Телефон Тогда

		КомандыТипа.Вставить("ПозвонитьПоТелефону",      УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПозвонитьПоТелефону"));
		КомандыТипа.Вставить("ОтправитьSMS",             УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ОтправитьSMS"));
		КомандыТипа.Вставить("ПоказатьИсториюИзменений", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьИсториюИзменений"));
		
	ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Факс Тогда

		КомандыТипа.Вставить("ОтправитьФакс",            УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ОтправитьФакс"));
		КомандыТипа.Вставить("ПоказатьИсториюИзменений", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПоказатьИсториюИзменений"));

	ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты Тогда

		КомандыТипа.Вставить("НаписатьЭлектронноеПисьмо", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("НаписатьЭлектронноеПисьмо"));

	ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Skype Тогда

		КомандыТипа.Вставить("ПозвонитьSkype", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ПозвонитьSkype"));
		КомандыТипа.Вставить("НачатьЧатSkype", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("НачатьЧатSkype"));

	ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.ВебСтраница Тогда

		КомандыТипа.Вставить("ОткрытьВебСтраницу", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ОткрытьВебСтраницу"));

	ИначеЕсли Тип = Перечисления.ТипыКонтактнойИнформации.Другое Тогда

		КомандыТипа.Вставить("ОткрытьОкноДругое", УправлениеКонтактнойИнформацией.ОписаниеКомандыПоИмени("ОткрытьОкноДругое"));

	КонецЕсли;

	Возврат КомандыТипа;

КонецФункции

#КонецОбласти
